
Date.prototype.msstamp = function () { return new Date(this).valueOf(); }
Date.prototype.sstamp = function () { return parseInt(new Date(this).valueOf()/ 1000); }
Date.prototype.stamp = function (days) { return new Date(this).valueOf(); }

Date.prototype.addDays = function (days) {
    var date = new Date(this);
    date.setDate(date.getDate() + days);
    return date;
}
Date.prototype.addMonths = function (mons) {
    var date = new Date(this);
    date.setMonth(date.getMonth() + 1 + mons);
    return date;
}
Date.prototype.addYears = function (years) {
    var date = new Date(this);
	//console.log (date.getYear(),date.getFullYear() )
    date.setFullYear(date.getFullYear() + years);
    return date;
}
Date.prototype.Format = function (fmt) {
    if (fmt == null || fmt == '')
        fmt = 'yyyy-MM-dd hh:mm:ss'
    var o = {
        "M+": this.getMonth() + 1, //月 
        "d+": this.getDate(), //日 
        "h+": this.getHours(), //时 
        "m+": this.getMinutes(), //分 
        "s+": this.getSeconds(), //秒 
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒 
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}



//--------------------------------------------------- 
// 日期格式化
// 格式 YYYY/yyyy/YY/yy 表示年份 
// MM/M 月份 
// W/w 星期 
// dd/DD/d/D 日期 
// hh/HH/h/H 时间 
// mm/m 分钟 
// ss/SS/s/S 秒 
//--------------------------------------------------- 
Date.prototype.format2 = function (str) {
    /**
     *  支持周格式
     */
    if (str == null || str == '')
        str = 'yyyy-MM-dd hh:mm:ss'
    var Week = ['日', '一', '二', '三', '四', '五', '六'];

    str = str.replace(/yyyy|YYYY/, this.getFullYear());
    str = str.replace(/yy|YY/, (this.getYear() % 100) > 9 ? (this.getYear() % 100).toString() : '0' + (this.getYear() % 100));
    let mon = this.getMonth() + 1
    str = str.replace(/MM/, mon > 9 ? mon.toString() : '0' + mon);
    str = str.replace(/M/g, mon);

    str = str.replace(/w|W/g, Week[this.getDay()]);

    str = str.replace(/dd|DD/, this.getDate() > 9 ? this.getDate().toString() : '0' + this.getDate());
    str = str.replace(/d|D/g, this.getDate());

    str = str.replace(/hh|HH/, this.getHours() > 9 ? this.getHours().toString() : '0' + this.getHours());
    str = str.replace(/h|H/g, this.getHours());
    str = str.replace(/mm/, this.getMinutes() > 9 ? this.getMinutes().toString() : '0' + this.getMinutes());
    str = str.replace(/m/g, this.getMinutes());

    str = str.replace(/ss|SS/, this.getSeconds() > 9 ? this.getSeconds().toString() : '0' + this.getSeconds());
    str = str.replace(/s|S/g, this.getSeconds());

    return str;
}

//--------------------------------------------------- 
// 判断闰年 
//--------------------------------------------------- 
Date.prototype.isLeapYear = function () {
    return (0 == this.getYear() % 4 && ((this.getYear() % 100 != 0) || (this.getYear() % 400 == 0)));
}




//+--------------------------------------------------- 
//| 日期计算 
//+--------------------------------------------------- 
Date.prototype.addDate = function (strInterval, Number) {
    var dtTmp = this;
    switch (strInterval) {
        case 's': return new Date(Date.parse(dtTmp) + (1000 * Number));
        case 'n': return new Date(Date.parse(dtTmp) + (60000 * Number));
        case 'h': return new Date(Date.parse(dtTmp) + (3600000 * Number));
        case 'd': return new Date(Date.parse(dtTmp) + (86400000 * Number));
        case 'w': return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number));
        case 'q': return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number * 3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
        case 'm': return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
        case 'y': return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
    }
}

//+--------------------------------------------------- 
//| 比较日期差 dtEnd 格式为日期型或者有效日期格式字符串 
//+--------------------------------------------------- 
Date.prototype.diff = function ( dtEnd,strInterval) {
    var dtStart = this;
    if (typeof dtEnd == 'string')//如果是字符串转换为日期型 
    {
        dtEnd = StringToDate(dtEnd);
    }
    switch (strInterval) {
        case 's': return parseInt((dtEnd - dtStart) / 1000);
        case 'n': return parseInt((dtEnd - dtStart) / 60000);
        case 'h': return parseInt((dtEnd - dtStart) / 3600000);
        case 'd': return parseInt((dtEnd - dtStart) / 86400000);
        case 'w': return parseInt((dtEnd - dtStart) / (86400000 * 7));
        case 'm': return (dtEnd.getMonth() + 1) + ((dtEnd.getFullYear() - dtStart.getFullYear()) * 12) - (dtStart.getMonth() + 1);
        case 'y': return dtEnd.getFullYear() - dtStart.getFullYear();
    }
}

//+--------------------------------------------------- 
//| 日期输出字符串，重载了系统的toString方法 
//+--------------------------------------------------- 
Date.prototype.toString = function (showWeek) {
    var myDate = this;
    var str = myDate.toLocaleDateString();
    if (showWeek) {
        var Week = ['日', '一', '二', '三', '四', '五', '六'];
        str += ' 星期' + Week[myDate.getDay()];
    }
    return str;
}

/**
 * 把日期分割成数组 
 * 注意月份是从0开始
 */
Date.prototype.toArray = function () {
    var myDate = this;
    var myArray = Array();
    myArray[0] = myDate.getFullYear();
    myArray[1] = myDate.getMonth();
    myArray[2] = myDate.getDate();
    myArray[3] = myDate.getHours();
    myArray[4] = myDate.getMinutes();
    myArray[5] = myDate.getSeconds();
    return myArray;
}

//+--------------------------------------------------- 
//| 取得日期数据信息 
//| 参数 interval 表示数据类型 
//| y 年 m月 d日 w星期 ww周 h时 n分 s秒 
//+--------------------------------------------------- 
Date.prototype.DatePart = function (interval) {
    var myDate = this;
    var partStr = '';
    var Week = ['日', '一', '二', '三', '四', '五', '六'];
    switch (interval) {
        case 'y': partStr = myDate.getFullYear(); break;
        case 'm': partStr = myDate.getMonth() + 1; break;
        case 'd': partStr = myDate.getDate(); break;
        case 'w': partStr = Week[myDate.getDay()]; break;
        case 'ww': partStr = myDate.WeekNumOfYear(); break;
        case 'h': partStr = myDate.getHours(); break;
        case 'n': partStr = myDate.getMinutes(); break;
        case 's': partStr = myDate.getSeconds(); break;
    }
    return partStr;
}

//+--------------------------------------------------- 
//| 取得当前日期所在月的最大天数 
//+--------------------------------------------------- 
Date.prototype.MaxDayOfMon = function () {
    var ary = this.toArray();
    var date1 = new Date(ary[0], ary[1], 1);
    var date2 = date1.addDate('m', 1);
    var result = date1.diff('d', date2);
    return result;
}
/**
 * 当前月的第一天
 */
Date.prototype.FirstDayOfDate = function () {
    var ary = this.toArray();
    var date1 = new Date(ary[0], ary[1], 1);
    return date1;
}
/**
 * 当前月的最后一天
 * 
 */
Date.prototype.LastDayOfDate = function () {
    var ary = this.toArray();
    var date1 = new Date(ary[0], ary[1], 1);
    var date2 = date1.addDate('m', 1).addDate('d', -1)
    return date2;
}
//+--------------------------------------------------- 
//| 日期合法性验证 
//| 格式为：YYYY-MM-DD或YYYY/MM/DD 
//+--------------------------------------------------- 
export function isValid(DateStr) {
    var sDate = DateStr.replace(/(^\s+|\s+$)/g, ''); //去两边空格; 
    if (sDate == '') return true;
    //如果格式满足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替换为'' 
    //数据库中，合法日期可以是:YYYY-MM/DD(2003-3/21),数据库会自动转换为YYYY-MM-DD格式 
    var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g, '');
    if (s == '') //说明格式满足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D 
    {
        var t = new Date(sDate.replace(/\-/g, '/'));
        var ar = sDate.split(/[-/:]/);
        if (ar[0] != t.getYear() || ar[1] != t.getMonth() + 1 || ar[2] != t.getDate()) {
            //alert('错误的日期格式！格式为：YYYY-MM-DD或YYYY/MM/DD。注意闰年。'); 
            return false;
        }
    }
    else {
        //alert('错误的日期格式！格式为：YYYY-MM-DD或YYYY/MM/DD。注意闰年。'); 
        return false;
    }
    return true;
}

//+--------------------------------------------------- 
//| 日期时间检查 
//| 格式为：YYYY-MM-DD HH:MM:SS 
//+--------------------------------------------------- 
export function CheckDate(str) {
    var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2 }):(\d{ 1,2 }):(\d{ 1,2 })$/;
    var r = str.match(reg);
    if (r == null) return false;
    r[2] = r[2] - 1;
    var d = new Date(r[1], r[2], r[3], r[4], r[5], r[6]);
    if (d.getFullYear() != r[1]) return false;
    if (d.getMonth() != r[2]) return false;
    if (d.getDate() != r[3]) return false;
    if (d.getHours() != r[4]) return false;
    if (d.getMinutes() != r[5]) return false;
    if (d.getSeconds() != r[6]) return false;
    return true;
}


/**
 * 直接计算 201709 + 4= 201801
 * @param {*} monnum 
 * @param {*} num 
 */
export function addmonnum(monnum, num) {
    var ym = new Number(monnum)
    var y = parseInt(ym / 100); //2017
    var m = ym % 100; //09
    var cnt = parseInt(num / 12);
    var mnt = num % 12;
    y = y + cnt;
    if (mnt < 0) {
        y = y - 1;
        m = m + (12 + mnt);
    } else {
        m = m + mnt;
    }
    if (m > 12) {
        y = y + 1;
        m -= 12;
    }
    return (y * 100 + m).toString();
}


//+--------------------------------------------------- 
//| 字符串转成日期类型 
//| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd 
//+--------------------------------------------------- 
export function StringToDate(DateStr) {
    var converted = Date.parse(DateStr);   
    var myDate = new Date(converted);
    if (isNaN(myDate)) {
        return new Date(0)    
    }
    return myDate;
}

export function f出生年月_年龄(出生年月){
	let str=出生年月+"-01";
	let d1=new Date(str);
	let d2=new Date();
	return d2.getFullYear()-	d1.getFullYear();	
}
export function f年龄_出生年月(age){
	let i=0-  (typeof(age)=='string' ? parseInt(age):age);
	let d1=new Date();
	return d1.addYears(i).Format('yyyy-MM');
}

export function getNow(str){
	if (str==null)
		return new Date().Format();
	else
		return StringToDate(str).format2();
}

//export var now = new Date();

//时间戳转日期

// console.log(StringToDate('2020-12-2 9:2:3 2').format2())
//console.log(new Date().sstamp())
//console.log(new Date().msstamp())
// console.log(now.addDays(2))
// console.log(now.addDays(2).Format())
// console.log(now.addDays(1).format2('yyyy-MM-dd 周w'))
// console.log(now.addMonths(-1).toArray());
// console.log(now.addDate('m', -1).format2())
// console.log(now.diff('d', '2020-12-2'))
// console.log(now.DatePart('m'))
// console.log(now.MaxDayOfMon())
// console.log(now.FirstDayOfDate().toString())
// console.log(now.LastDayOfDate().toString())
// console.log(now.toString())

